#ifndef SYSTEMINFOHANDLER_H
#define SYSTEMINFOHANDLER_H

#include "systemCallHandler.h"
#include <QDateTime>
#include <QTimer>
#include <QElapsedTimer>
#include <QRandomGenerator>
#include <QMap>
#include <QSet>

/**
 * @brief 内存块结构体
 * 用于跟踪动态分配的内存块
 */
struct MemoryBlock {
    int address;        // 内存地址
    int size;           // 内存大小
    bool isAllocated;   // 是否已分配
    qint64 timestamp;   // 分配时间戳
    
    MemoryBlock() : address(-1), size(0), isAllocated(false), timestamp(0) {}
    MemoryBlock(int addr, int sz) : address(addr), size(sz), isAllocated(true), timestamp(QDateTime::currentMSecsSinceEpoch()) {}
};

/**
 * @brief 系统信息处理器类
 * 
 * 处理系统信息查询和内存管理相关的系统调用，包括时间日期获取、
 * 系统状态查询、动态内存分配等功能。
 * 支持的中断号范围：0x50-0x6F
 */
class SystemInfoHandler : public SystemCallHandler
{
    Q_OBJECT

public:
    explicit SystemInfoHandler(QObject *parent = nullptr);
    ~SystemInfoHandler() override;

    // 重写基类虚函数
    SystemCallResult handleInterrupt(int interruptNumber, CpuSimulator* cpu) override;
    QPair<int, int> getSupportedInterruptRange() const override;
    QString getDescription() const override;
    void reset() override;

    /**
     * @brief 设置模拟内存大小
     * @param totalMemory 总内存大小（字节）
     */
    void setTotalMemory(int totalMemory);

    /**
     * @brief 获取内存使用统计
     * @return QPair<int, int> 已用内存和总内存
     */
    QPair<int, int> getMemoryStats() const;

private:
    // 系统信息中断处理方法 (0x50-0x5F)

    /**
     * @brief INT 0x50 - 获取系统时间
     * 返回：AX=小时, BX=分钟, CX=秒
     */
    SystemCallResult handleGetSystemTime(CpuSimulator* cpu);

    /**
     * @brief INT 0x51 - 获取系统日期
     * 返回：AX=年, BX=月, CX=日
     */
    SystemCallResult handleGetSystemDate(CpuSimulator* cpu);

    /**
     * @brief INT 0x52 - 获取毫秒时间戳
     * 返回：AX=时间戳高位, BX=时间戳低位
     */
    SystemCallResult handleGetTimestamp(CpuSimulator* cpu);

    /**
     * @brief INT 0x53 - 延时操作
     * 参数：AX=延时毫秒数
     * 返回：AX=实际延时时间
     */
    SystemCallResult handleDelay(CpuSimulator* cpu);

    /**
     * @brief INT 0x54 - 获取内存使用情况
     * 返回：AX=已用内存, BX=总内存
     */
    SystemCallResult handleGetMemoryUsage(CpuSimulator* cpu);

    /**
     * @brief INT 0x55 - 获取CPU使用率（模拟）
     * 返回：AX=CPU使用率百分比
     */
    SystemCallResult handleGetCpuUsage(CpuSimulator* cpu);

    /**
     * @brief INT 0x56 - 系统重启模拟
     * 返回：AX=状态码（0=成功）
     */
    SystemCallResult handleSystemReboot(CpuSimulator* cpu);

    /**
     * @brief INT 0x57 - 系统关机模拟
     * 返回：AX=状态码（0=成功）
     */
    SystemCallResult handleSystemShutdown(CpuSimulator* cpu);

    /**
     * @brief INT 0x58 - 获取系统运行时间
     * 返回：AX=运行时间（秒）
     */
    SystemCallResult handleGetUptime(CpuSimulator* cpu);

    /**
     * @brief INT 0x59 - 设置系统时间
     * 参数：AX=小时, BX=分钟, CX=秒
     * 返回：AX=设置状态（0=成功）
     */
    SystemCallResult handleSetSystemTime(CpuSimulator* cpu);

    /**
     * @brief INT 0x5A - 获取随机种子
     * 返回：AX=随机种子值
     */
    SystemCallResult handleGetRandomSeed(CpuSimulator* cpu);

    /**
     * @brief INT 0x5B - 设置随机种子
     * 参数：AX=种子值
     * 返回：AX=设置状态（0=成功）
     */
    SystemCallResult handleSetRandomSeed(CpuSimulator* cpu);

    // 内存管理中断处理方法 (0x60-0x6F)

    /**
     * @brief INT 0x60 - 动态内存分配
     * 参数：AX=申请大小（字节）
     * 返回：BX=分配的内存地址（0表示失败）
     */
    SystemCallResult handleMemoryAllocate(CpuSimulator* cpu);

    /**
     * @brief INT 0x61 - 内存释放
     * 参数：AX=内存地址
     * 返回：AX=释放状态（0=成功）
     */
    SystemCallResult handleMemoryFree(CpuSimulator* cpu);

    /**
     * @brief INT 0x62 - 内存复制
     * 参数：AX=源地址, BX=目标地址, CX=复制大小
     * 返回：AX=复制状态（0=成功）
     */
    SystemCallResult handleMemoryCopy(CpuSimulator* cpu);

    /**
     * @brief INT 0x63 - 内存填充
     * 参数：AX=目标地址, BX=填充值, CX=填充大小
     * 返回：AX=填充状态（0=成功）
     */
    SystemCallResult handleMemoryFill(CpuSimulator* cpu);

    /**
     * @brief INT 0x64 - 内存比较
     * 参数：AX=地址1, BX=地址2, CX=比较大小
     * 返回：DX=比较结果（-1:小于, 0:等于, 1:大于）
     */
    SystemCallResult handleMemoryCompare(CpuSimulator* cpu);

    /**
     * @brief INT 0x65 - 获取内存块信息
     * 参数：AX=内存地址
     * 返回：BX=块大小, CX=分配状态
     */
    SystemCallResult handleGetMemoryInfo(CpuSimulator* cpu);

    /**
     * @brief INT 0x66 - 内存重新分配
     * 参数：AX=原地址, BX=新大小
     * 返回：CX=新地址（0表示失败）
     */
    SystemCallResult handleMemoryReallocate(CpuSimulator* cpu);

    /**
     * @brief INT 0x67 - 内存对齐分配
     * 参数：AX=大小, BX=对齐字节数
     * 返回：CX=分配地址（0表示失败）
     */
    SystemCallResult handleMemoryAlignedAllocate(CpuSimulator* cpu);

    /**
     * @brief INT 0x68 - 获取内存碎片信息
     * 返回：AX=碎片数量, BX=最大连续空闲块大小
     */
    SystemCallResult handleGetMemoryFragmentation(CpuSimulator* cpu);

    /**
     * @brief INT 0x69 - 内存压缩（碎片整理）
     * 返回：AX=压缩状态（0=成功）
     */
    SystemCallResult handleMemoryCompression(CpuSimulator* cpu);

    // 辅助方法

    /**
     * @brief 查找可用的内存块
     * @param size 需要的内存大小
     * @param alignment 对齐要求
     * @return int 找到的内存地址（-1表示失败）
     */
    int findAvailableMemoryBlock(int size, int alignment = 1);

    /**
     * @brief 分配内存块
     * @param address 内存地址
     * @param size 内存大小
     * @return bool 分配是否成功
     */
    bool allocateMemoryBlock(int address, int size);

    /**
     * @brief 释放内存块
     * @param address 内存地址
     * @return bool 释放是否成功
     */
    bool freeMemoryBlock(int address);

    /**
     * @brief 查找内存块
     * @param address 内存地址
     * @return MemoryBlock* 内存块指针（nullptr表示未找到）
     */
    MemoryBlock* findMemoryBlock(int address);

    /**
     * @brief 合并相邻的空闲内存块
     */
    void mergeAdjacentFreeBlocks();

    /**
     * @brief 计算内存碎片化程度
     * @return QPair<int, int> 碎片数量和最大连续空闲块大小
     */
    QPair<int, int> calculateFragmentation() const;

    /**
     * @brief 验证内存地址是否有效
     * @param address 内存地址
     * @param size 访问大小
     * @return bool 地址是否有效
     */
    bool isValidMemoryAddress(int address, int size = 1) const;

    /**
     * @brief 模拟CPU使用率
     * @return int CPU使用率百分比
     */
    int simulateCpuUsage();

    /**
     * @brief 执行延时操作
     * @param milliseconds 延时毫秒数
     * @return int 实际延时时间
     */
    int performDelay(int milliseconds);

private:
    QElapsedTimer systemUptime;                      // 系统运行时间计时器
    QRandomGenerator* randomGenerator;               // 随机数生成器
    QMap<int, MemoryBlock> memoryBlocks;            // 内存块映射表
    QSet<int> freeMemoryAddresses;                  // 空闲内存地址集合
    
    int totalMemorySize;                            // 总内存大小
    int allocatedMemorySize;                        // 已分配内存大小
    int memoryBaseAddress;                          // 内存基址
    int nextAllocationAddress;                      // 下一个分配地址
    
    // 系统状态
    bool isShutdownRequested;                       // 是否请求关机
    bool isRebootRequested;                         // 是否请求重启
    qint64 systemStartTime;                         // 系统启动时间
    QDateTime simulatedSystemTime;                  // 模拟的系统时间
    
    // 性能监控
    QList<int> cpuUsageHistory;                     // CPU使用率历史
    int cpuUsageUpdateCounter;                      // CPU使用率更新计数器
    
    // 常量定义
    static const int DEFAULT_MEMORY_SIZE = 1048576;  // 默认内存大小（1MB）
    static const int MIN_MEMORY_BLOCK_SIZE = 4;      // 最小内存块大小
    static const int MAX_MEMORY_BLOCK_SIZE = 65536;  // 最大内存块大小
    static const int MEMORY_ALIGNMENT = 4;           // 默认内存对齐
    static const int MAX_DELAY_TIME = 10000;         // 最大延时时间（毫秒）

signals:
    /**
     * @brief 系统关机请求信号
     */
    void systemShutdownRequested();

    /**
     * @brief 系统重启请求信号
     */
    void systemRebootRequested();

    /**
     * @brief 内存不足警告信号
     * @param requiredSize 请求的内存大小
     * @param availableSize 可用内存大小
     */
    void memoryLowWarning(int requiredSize, int availableSize);
};

#endif // SYSTEMINFOHANDLER_H 